#include "SPI_PANEL_INIT.h"  
#include "usart.h"
u8 TO_RGB565[2]={0};
void SPI_PANEL_IO_init(void)
{
    GPIO_InitTypeDef GPIO_Initure;	
	__HAL_RCC_GPIOD_CLK_ENABLE();	
	__HAL_RCC_GPIOE_CLK_ENABLE();	
    __HAL_RCC_GPIOG_CLK_ENABLE();
	GPIO_Initure.Speed= GPIO_SPEED_LOW;//GPIO_SPEED_HIGH;     //高速
	GPIO_Initure.Pull = GPIO_PULLUP;
	GPIO_Initure.Mode = GPIO_MODE_OUTPUT_PP;	

	GPIO_Initure.Pin = SPI_PANEL_SCK;				
	HAL_GPIO_Init(SPI_PANEL_SCK_Periph_GPIO,&GPIO_Initure); //	CLK
			
	GPIO_Initure.Pin = SPI_PANEL_MOSI;				
	HAL_GPIO_Init(SPI_PANEL_MOSIPeriph_GPIO,&GPIO_Initure);//	MOSI
	
	GPIO_Initure.Pin = SPI_PANEL_CS1;//	CS1			
	HAL_GPIO_Init(SPI_PANEL_CS_Periph_GPIO,&GPIO_Initure);//	
	
	GPIO_Initure.Pin = ARM_PANEL_OE1;//	OE1,OE2	
	HAL_GPIO_Init(ARM_PANEL_OE_Periph_GPIO,&GPIO_Initure);

//	GPIO_Initure.Pin = M25P64_CS0;//	CS0
//	HAL_GPIO_Init(M25P64_CS_Periph_GPIO,&GPIO_Initure);
	
	GPIO_Initure.Mode=GPIO_MODE_INPUT;
	GPIO_Initure.Pin=SPI_PANEL_MISO;					//	MISO
	HAL_GPIO_Init(SPI_PANEL_MISO_Periph_GPIO,&GPIO_Initure);
	
}

void MOSI_PANEL_IO_OUTPUT(void)
{
	GPIO_InitTypeDef GPIO_Initure;
	__HAL_RCC_GPIOD_CLK_ENABLE();
	GPIO_Initure.Speed= GPIO_SPEED_LOW;     //高速
	GPIO_Initure.Pull = GPIO_PULLUP;
	GPIO_Initure.Mode = GPIO_MODE_OUTPUT_PP;
	GPIO_Initure.Pin=SPI_PANEL_MOSI;					//	MOSI
	HAL_GPIO_Init(SPI_PANEL_MOSIPeriph_GPIO,&GPIO_Initure);
}

void MOSI_PANEL_IO_INPUT(void)
{
	GPIO_InitTypeDef GPIO_Initure;
	__HAL_RCC_GPIOD_CLK_ENABLE();

	GPIO_Initure.Speed= GPIO_SPEED_LOW;     //高速
	GPIO_Initure.Pull = GPIO_PULLDOWN;
	GPIO_Initure.Mode = GPIO_MODE_INPUT;		
	GPIO_Initure.Pin=SPI_PANEL_MOSI;					//	MOSI
	HAL_GPIO_Init(SPI_PANEL_MOSIPeriph_GPIO,&GPIO_Initure);	
//	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN;
//	GPIO_InitStructure.GPIO_PIN=SPI_PANEL_MISO;					//	MISO
//	GPIO_Init(SPI_PANEL_MISO_Periph_GPIO,&GPIO_InitStructure);	
}

void SPI_PANEL_CS_Select(u8 channel,u8 enable)
{
    if(enable == 0)
    {
		HAL_GPIO_WritePin( SPI_PANEL_CS_Periph_GPIO,  SPI_PANEL_CS1	 ,GPIO_PIN_RESET);	//CS1_CLR
    }
    else if(enable == 1)
    {
		HAL_GPIO_WritePin( SPI_PANEL_CS_Periph_GPIO, SPI_PANEL_CS1 ,GPIO_PIN_SET);	//CS1_SET  
    }
}

void SPI_PANEL_4L_DCX_Select(u8 channel,u8 enable)
{
	if(enable == 0)
	{
		HAL_GPIO_WritePin( ARM_PANEL_OE_Periph_GPIO,  ARM_PANEL_OE1,GPIO_PIN_RESET);	//LCD_DCX1_CLR;
	}
	else if(enable == 1)
	{
		HAL_GPIO_WritePin( ARM_PANEL_OE_Periph_GPIO,  ARM_PANEL_OE1,GPIO_PIN_SET);	//LCD_DCX1_CLR;
	}
}

////SPI4-1P1T 1Wire	RGB888/RGB666/RGB565
void SPI_PANEL_Write_1P1T1_Data_NoCS(u32 data ,u8 RGB_format)
{
	u8 i;
	//u8 data1,data2,data3;
	if(RGB_format == 1)    //RGB888
	{
		if(data & (0x00800000))
		{
			HAL_GPIO_WritePin(SPI_PANEL_MOSIPeriph_GPIO, SPI_PANEL_MOSI,GPIO_PIN_SET);
		}
		else
			HAL_GPIO_WritePin(SPI_PANEL_MOSIPeriph_GPIO,SPI_PANEL_MOSI,GPIO_PIN_RESET);
		HAL_GPIO_WritePin	( ARM_PANEL_OE_Periph_GPIO,  ARM_PANEL_OE1,GPIO_PIN_SET);	    //LCD_DCX1_SET;
		
		HAL_GPIO_WritePin  ( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK,GPIO_PIN_RESET);
		delay_6ns(1);
		HAL_GPIO_WritePin	( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK,GPIO_PIN_SET);	
		
		data<<=9;
		for(i = 0;i < 23; ++i)
		{
			if(data&(1<<31))
				HAL_GPIO_WritePin	( SPI_PANEL_MOSIPeriph_GPIO,  SPI_PANEL_MOSI,GPIO_PIN_SET);	//LCD_SDA_SET;
			else					
				HAL_GPIO_WritePin  ( SPI_PANEL_MOSIPeriph_GPIO,  SPI_PANEL_MOSI,GPIO_PIN_RESET);	//LCD_SDA_C
			data<<=1;
			HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK,GPIO_PIN_RESET);	//LCD_SCL_CLR;		
			delay_6ns(1);
			HAL_GPIO_WritePin	( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK,GPIO_PIN_SET);	//LCD_SCL_SET;	
		}
		HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK,GPIO_PIN_RESET);	//LCD_SCL_CLR;
	}
	else if(RGB_format == 0)		//RGB666
	{
		data<<=14;
		for(i = 0;i < 18; ++i)
		{
			if(data&(1<<17))
				HAL_GPIO_WritePin	( SPI_PANEL_MOSIPeriph_GPIO,  SPI_PANEL_MOSI,GPIO_PIN_SET);	//LCD_SDA_SET;
			else					
				HAL_GPIO_WritePin  ( SPI_PANEL_MOSIPeriph_GPIO,  SPI_PANEL_MOSI,GPIO_PIN_RESET);	//LCD_SDA_C
			data<<=1;
			HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK,GPIO_PIN_RESET);	//LCD_SCL_CLR;		
			HAL_GPIO_WritePin	( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK,GPIO_PIN_SET);	//LCD_SCL_SET;	
		}
	}
	else if(RGB_format == 2)		//RGB565
	{
		if(data & (0x00008000))
		{
			HAL_GPIO_WritePin(SPI_PANEL_MOSIPeriph_GPIO, SPI_PANEL_MOSI,GPIO_PIN_SET);
		}
		else
			HAL_GPIO_WritePin(SPI_PANEL_MOSIPeriph_GPIO,SPI_PANEL_MOSI,GPIO_PIN_RESET);
		HAL_GPIO_WritePin	( ARM_PANEL_OE_Periph_GPIO,  ARM_PANEL_OE1,GPIO_PIN_SET);	    //LCD_DCX1_SET;
		
		HAL_GPIO_WritePin  ( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK,GPIO_PIN_RESET);
		HAL_GPIO_WritePin	( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK,GPIO_PIN_SET);	
		
		data<<=1;
		for(i = 0;i < 15; ++i)
		{
			if(data&(1<<15))
					HAL_GPIO_WritePin	( SPI_PANEL_MOSIPeriph_GPIO,  SPI_PANEL_MOSI,GPIO_PIN_SET);	//LCD_SDA_SET;
			else					
					HAL_GPIO_WritePin  ( SPI_PANEL_MOSIPeriph_GPIO,  SPI_PANEL_MOSI,GPIO_PIN_RESET);	//LCD_SDA_C
			data<<=1;
			HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK,GPIO_PIN_RESET);	//LCD_SCL_CLR;		
			HAL_GPIO_WritePin	( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK,GPIO_PIN_SET);	//LCD_SCL_SET;	
		}		
	}
}
////SPI4-1P1T 2Wire	RGB888/RGB666/RGB565
void SPI_PANEL_Write_1P1T2_Data_NoCS(u32 data, u8 RGB_format)
{
	u8 i;
	u16 data1,data2;
	HAL_GPIO_WritePin	( SPI_PANEL_MOSIPeriph_GPIO,  SPI_PANEL_MOSI,GPIO_PIN_SET);	//LCD_SDA_SET;
	HAL_GPIO_WritePin	( ARM_PANEL_OE_Periph_GPIO,  ARM_PANEL_OE1,GPIO_PIN_SET);	    //LCD_DCX1_SET;
	HAL_GPIO_WritePin  	( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK,GPIO_PIN_RESET);	    //LCD_SCL_CLR;	
	HAL_GPIO_WritePin	( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK,GPIO_PIN_SET);	    //LCD_SCL_SET;
//	data1 = (u8)(data&0xff);
//	data2	= (u8)((data>>8)&0xff);
//	data3 = (u8)((data>>16)&0xff);
	if(RGB_format == 1)    //RGB888
	{
		data1 = ((u16)(data&0x0fff))<<4;
		data2 = ((u16)((data>>12)&0x0fff))<<4;
		for(i = 0;i < 12; ++i)
		{
			if(data2&(1 << 15))
				HAL_GPIO_WritePin	( SPI_PANEL_MOSIPeriph_GPIO,  SPI_PANEL_MOSI,GPIO_PIN_SET);	//LCD_SDA_SET;
			else					
				HAL_GPIO_WritePin  ( SPI_PANEL_MOSIPeriph_GPIO,  SPI_PANEL_MOSI,GPIO_PIN_RESET);	//LCD_SDA_C
			if(data1&(1 << 15))
			{
				HAL_GPIO_WritePin	( ARM_PANEL_OE_Periph_GPIO,  ARM_PANEL_OE1,GPIO_PIN_SET);	//LCD_DCX_SET;
			}
			else
			{
					HAL_GPIO_WritePin	( ARM_PANEL_OE_Periph_GPIO,  ARM_PANEL_OE1,GPIO_PIN_RESET);	//LCD_DCX_CLR;
			}
			data1<<=1;
			data2<<=1;
			HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK,GPIO_PIN_RESET);	//LCD_SCL_CLR;		
			HAL_GPIO_WritePin	( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK,GPIO_PIN_SET);	//LCD_SCL_SET;	
		}
	}
	else if(RGB_format == 0)		//RGB666
	{
		data1 = ((u16)(data&0x01ff))<<7;
		data2 = ((u16)((data>>9)&0x01ff))<<7;
		for(i = 0;i < 9; ++i)
		{
			if(data2&(1 << 15))
				HAL_GPIO_WritePin	( SPI_PANEL_MOSIPeriph_GPIO,  SPI_PANEL_MOSI,GPIO_PIN_SET);	//LCD_SDA_SET;
			else					
				HAL_GPIO_WritePin  ( SPI_PANEL_MOSIPeriph_GPIO,  SPI_PANEL_MOSI,GPIO_PIN_RESET);	//LCD_SDA_C
			if(data1&(1 << 15))
			{
				HAL_GPIO_WritePin	( ARM_PANEL_OE_Periph_GPIO,  ARM_PANEL_OE1,GPIO_PIN_SET);	//LCD_DCX_SET;
			}
			else
			{
				HAL_GPIO_WritePin	( ARM_PANEL_OE_Periph_GPIO,  ARM_PANEL_OE1,GPIO_PIN_RESET);	//LCD_DCX_CLR;
			}
			data1<<=1;
			data2<<=1;
			HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK,GPIO_PIN_RESET);	//LCD_SCL_CLR;		
			HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK,GPIO_PIN_SET);	//LCD_SCL_SET;	
		}
	}
	else if(RGB_format == 2)		//RGB565
	{
		data1 = (u8)(data&0xff);
		data2 = (u8)(data>>8)&0xff;
		for(i = 0;i < 8; ++i)
		{
			if(data2&(1 << 7))
				HAL_GPIO_WritePin( SPI_PANEL_MOSIPeriph_GPIO,  SPI_PANEL_MOSI,GPIO_PIN_SET);	//LCD_SDA_SET;
			else					
				HAL_GPIO_WritePin( SPI_PANEL_MOSIPeriph_GPIO,  SPI_PANEL_MOSI,GPIO_PIN_RESET);	//LCD_SDA_C
			if(data1&(1 << 7))
			{
				HAL_GPIO_WritePin( ARM_PANEL_OE_Periph_GPIO,  ARM_PANEL_OE1,GPIO_PIN_SET);	//LCD_DCX_SET;
			}
			else
			{
				HAL_GPIO_WritePin( ARM_PANEL_OE_Periph_GPIO,  ARM_PANEL_OE1,GPIO_PIN_RESET);	//LCD_DCX_CLR;
			}
			data1<<=1;
			data2<<=1;
			HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK,GPIO_PIN_RESET);	//LCD_SCL_CLR;		
			HAL_GPIO_WritePin	( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK,GPIO_PIN_SET);	//LCD_SCL_SET;	
		}
	}
}
// SPI3-SP3T 2Wire
void SPI_PANEL_Write_2P3T_Data_NoCS(u16 data,u8 RGB_format)
{
	u8 i;
    u8 data1,data2;
	HAL_GPIO_WritePin( SPI_PANEL_MOSIPeriph_GPIO,  SPI_PANEL_MOSI,GPIO_PIN_SET);	//LCD_SDA_SET;
    HAL_GPIO_WritePin( ARM_PANEL_OE_Periph_GPIO,  ARM_PANEL_OE1,GPIO_PIN_SET);	    //LCD_DCX1_SET;
	HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK,GPIO_PIN_RESET);	    //LCD_SCL_CLR;	
	HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK,GPIO_PIN_SET);	    //LCD_SCL_SET;	
	data1 = (u8)(data&0xFF);
    data2 = (u8)(data>>8);    
	for (i = 0; i < 8; ++i)
	{
		if (data2 & (1 << 7)) 	
			HAL_GPIO_WritePin( SPI_PANEL_MOSIPeriph_GPIO,  SPI_PANEL_MOSI,GPIO_PIN_SET);	//LCD_SDA_SET;
		else					
			HAL_GPIO_WritePin ( SPI_PANEL_MOSIPeriph_GPIO,  SPI_PANEL_MOSI,GPIO_PIN_RESET);	//LCD_SDA_CLR;
        
 		if (data1 & (1 << 7)) 
        {            
			HAL_GPIO_WritePin( ARM_PANEL_OE_Periph_GPIO,  ARM_PANEL_OE1,GPIO_PIN_SET);	//LCD_DCX_SET;;
        }
		else					
        {
			HAL_GPIO_WritePin( ARM_PANEL_OE_Periph_GPIO,  ARM_PANEL_OE1,GPIO_PIN_RESET);	//LCD_DCX_CLR;
        }
        
		data1 <<= 1;
		data2 <<= 1;
		HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK,GPIO_PIN_RESET);	//LCD_SCL_CLR;		
		HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK,GPIO_PIN_SET);	//LCD_SCL_SET;		
	}

}

/*****************************************************
    ??8bit
    ???
*******************************************************/

void SPI_PANEL_Write_u8_Cmd(u8 SPI_Mode,u8 channel,u8 cmd)
{
	u8 i;
	//HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK,GPIO_PIN_RESET);	//LCD_SCL_CLR;	
	SPI_PANEL_CS_Select(channel,0);    
    if(SPI_Mode == SPI3_Mode)
    {
        HAL_GPIO_WritePin( SPI_PANEL_MOSIPeriph_GPIO,  SPI_PANEL_MOSI,GPIO_PIN_RESET);	//LCD_SDA_CLR;	
        HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK,GPIO_PIN_RESET);	//LCD_SCL_CLR;	
		delay_6ns(1);
        HAL_GPIO_WritePin	( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK,GPIO_PIN_SET);	//LCD_SCL_SET;
    }  
    else if(SPI_Mode == SPI4_Mode)
    {
        SPI_PANEL_4L_DCX_Select(channel,0);       //DCX = 0 ?? ??
        HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK,GPIO_PIN_RESET);	    //LCD_SCL_CLR;	
    }
  	delay_6ns(5);
	for (i = 0; i < 8; ++i)
	{
		if (cmd & (1 << 7)) 	
			HAL_GPIO_WritePin( SPI_PANEL_MOSIPeriph_GPIO,  SPI_PANEL_MOSI,GPIO_PIN_SET);	//LCD_SDA_SET;
		else					
			HAL_GPIO_WritePin( SPI_PANEL_MOSIPeriph_GPIO,  SPI_PANEL_MOSI,GPIO_PIN_RESET);	//LCD_SDA_CLR;
		cmd <<= 1;
		
		HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK,GPIO_PIN_RESET);	//LCD_SCL_CLR;
		delay_6ns(5);
		HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK,GPIO_PIN_SET);	//LCD_SCL_SET;
		delay_6ns(5);
	}
	HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK,GPIO_PIN_RESET);	//LCD_SCL_CLR;	
	SPI_PANEL_CS_Select(channel,1);	
}

void SPI_PANEL_Write_u8_Cmd_NoCS(u8 SPI_Mode,u8 cmd)
{
	u8 i;

	if(SPI_Mode == SPI3_Mode)
    {
        HAL_GPIO_WritePin( SPI_PANEL_MOSIPeriph_GPIO,  SPI_PANEL_MOSI,GPIO_PIN_RESET);	//LCD_SDA_CLR;	
        HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK,GPIO_PIN_RESET);	//LCD_SCL_CLR;	
        HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK,GPIO_PIN_SET);	//LCD_SCL_SET;
    }  
    else if(SPI_Mode == SPI4_Mode)
    {
        SPI_PANEL_4L_DCX_Select(CS1_2,0);       //DCX = 0 ?? ??
        HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK,GPIO_PIN_RESET);	    //LCD_SCL_CLR;	
    }   
	for (i = 0; i < 8; ++i)
	{
		if (cmd & (1 << 7)) 	
			HAL_GPIO_WritePin( SPI_PANEL_MOSIPeriph_GPIO,  SPI_PANEL_MOSI,GPIO_PIN_SET);	//LCD_SDA_SET;
		else					
			HAL_GPIO_WritePin( SPI_PANEL_MOSIPeriph_GPIO,  SPI_PANEL_MOSI,GPIO_PIN_RESET);	//LCD_SDA_CLR;
		cmd <<= 1;
		
		HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK,GPIO_PIN_RESET);	//LCD_SCL_CLR;
		delay_6ns(5);
		HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK,GPIO_PIN_SET);	//LCD_SCL_SET;	
	}
	HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK,GPIO_PIN_RESET);	//LCD_SCL_CLR;	
}


/*****************************************************
    ??8bit
    ???
*******************************************************/
void SPI_PANEL_Write_u8_Data(u8 SPI_Mode,u8 channel,u8 data)
{
	u8 i;
    u8 dat = 0;
    dat = data;
	//HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK,GPIO_PIN_RESET);	//LCD_SCL_CLR;	
	SPI_PANEL_CS_Select(channel,0);
    if(SPI_Mode == SPI3_Mode)
    {
        HAL_GPIO_WritePin( SPI_PANEL_MOSIPeriph_GPIO,  SPI_PANEL_MOSI ,GPIO_PIN_SET);	//LCD_SDA_SET;	
        HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK ,GPIO_PIN_RESET);	    //LCD_SCL_CLR;	
		delay_6ns(5);
        HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK ,GPIO_PIN_SET);	    //LCD_SCL_SET;
    }  
    else if(SPI_Mode == SPI4_Mode)
    {
        SPI_PANEL_4L_DCX_Select(channel,1);       //DCX = 0 ?? ??
        HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK,GPIO_PIN_RESET);	    //LCD_SCL_CLR;	
    } 			
	for (i = 0; i < 8; ++i)
	{
		if (dat & (1 << 7)) 	
			HAL_GPIO_WritePin( SPI_PANEL_MOSIPeriph_GPIO,  SPI_PANEL_MOSI,GPIO_PIN_SET);	//LCD_SDA_SET;
		else					
			HAL_GPIO_WritePin( SPI_PANEL_MOSIPeriph_GPIO,  SPI_PANEL_MOSI,GPIO_PIN_RESET);	//LCD_SDA_CLR;
		dat <<= 1;
		
		HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK,GPIO_PIN_RESET);	//LCD_SCL_CLR;
		
		HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK,GPIO_PIN_SET);	//LCD_SCL_SET;
		
	}
	SPI_PANEL_CS_Select(channel,1);
}

void SPI_PANEL_Write_u8_Data_NoCS(u8 SPI_Mode,u8 data)
{
	u8 i;
    if(SPI_Mode == SPI3_Mode)
    {
        HAL_GPIO_WritePin( SPI_PANEL_MOSIPeriph_GPIO,  SPI_PANEL_MOSI ,GPIO_PIN_SET);	//LCD_SDA_SET;	
        HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK ,GPIO_PIN_RESET);	    //LCD_SCL_CLR;	
        HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK ,GPIO_PIN_SET);	    //LCD_SCL_SET;
    }  
    else if(SPI_Mode == SPI4_Mode)
    {
        SPI_PANEL_4L_DCX_Select(CS1_2,1);       //DCX = 0 ?? ??
        HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK ,GPIO_PIN_RESET);	    //LCD_SCL_CLR;	
    }		
	for (i = 0; i < 8; ++i)
	{
		if (data & (1 << 7)) 	
			HAL_GPIO_WritePin( SPI_PANEL_MOSIPeriph_GPIO,  SPI_PANEL_MOSI ,GPIO_PIN_SET);	//LCD_SDA_SET;
		else					
			HAL_GPIO_WritePin( SPI_PANEL_MOSIPeriph_GPIO,  SPI_PANEL_MOSI ,GPIO_PIN_RESET);	//LCD_SDA_CLR;
		data <<= 1;		
		HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK , GPIO_PIN_RESET);	//LCD_SCL_CLR;		
	//	delay_6ns(5);
        HAL_GPIO_WritePin	( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK , GPIO_PIN_SET);	//LCD_SCL_SET;
	}
	HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK , GPIO_PIN_RESET);	//LCD_SCL_CLR;		
}
/*****************************************************
    ??8bit
   ?8bit??
*******************************************************/

u8 SPI3_PANEL_Read_u8_Data(u8 channel)
{
	u8 j,value = 0;
	SPI_PANEL_CS_Select(channel,0);
	for(j=0;j<8;j++) // 8 Data
	{
		HAL_GPIO_WritePin  ( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK, GPIO_PIN_RESET);	//LCD_SCL_CLR;
		HAL_GPIO_WritePin	( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK, GPIO_PIN_SET);	//LCD_SCL_SET;
		value<<= 1;
		if(HAL_GPIO_ReadPin(SPI_PANEL_MISO_Periph_GPIO,SPI_PANEL_MISO))
			value |= 0x01;	
	}
	SPI_PANEL_CS_Select(channel,1);	
	return value; 
	    
}

u8 SPI3_PANEL_Read_u8_Data_NoCS(void)
{
	u8 j,value = 0;
	for(j=0;j<8;j++) // 8 Data
	{
		HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK, GPIO_PIN_RESET);	//LCD_SCL_CLR;
        delay_6ns(1);
		HAL_GPIO_WritePin	( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK, GPIO_PIN_SET);	//LCD_SCL_SET;
		value<<= 1;
		if(HAL_GPIO_ReadPin(SPI_PANEL_MISO_Periph_GPIO,SPI_PANEL_MISO))
		value |= 0x01;	
	}
	return value; 
	    
}

u8 SPI3_PANEL_Read_u8_Data_NoCS_SDA(void)
{
	u8 j,value = 0;
	for(j=0;j<8;j++) // 8 Data
	{
		HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK, GPIO_PIN_RESET);	//LCD_SCL_CLR;
		delay_6ns(1);
        HAL_GPIO_WritePin	( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK, GPIO_PIN_SET);	//LCD_SCL_SET;
		value<<= 1;
		if(HAL_GPIO_ReadPin(SPI_PANEL_MOSIPeriph_GPIO,SPI_PANEL_MOSI))
		value |= 0x01;	
	}
	return value; 
	    
}
/*****************************************************
    ??8bit
   ?16bit??
*******************************************************/
u16 SPI3_PANEL_Read_u16_Data(u8 channel)
{
	uint8_t j;
	uint16_t value=0;
	SPI_PANEL_CS_Select(channel,0);
	for(j=0;j<16;j++) // 16 Data
	{
		HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK, GPIO_PIN_RESET);	//LCD_SCL_CLR;		
		HAL_GPIO_WritePin	( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK, GPIO_PIN_SET);	//LCD_SCL_SET;		
		value<<= 1;
		if(HAL_GPIO_ReadPin(SPI_PANEL_MISO_Periph_GPIO,SPI_PANEL_MISO))
		value |= 0x01;	
	}
	SPI_PANEL_CS_Select(channel,1);		
	return value;      
}


void SPI_PANEL_Write_code(u8 SPI_Mode,u8 channel ,u8 cmd,u8 data)
{  
	HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK, GPIO_PIN_RESET);	//LCD_SCL_CLR;
    SPI_PANEL_Write_u8_Cmd(SPI_Mode,channel,cmd);
    SPI_PANEL_Write_u8_Data(SPI_Mode,channel,data);
}
u8 GenR_PANEL_SPI4_Read_u8_Data(u8 SPI_Mode,u8 channel,u8 reg,u8 para[],u8 back_num)
{
	u8 j,value = 0;
	SPI_PANEL_CS_Select(channel,0);
   // GPIO_ResetBits( SPI1_SCK_Periph_GPIO,  SPI1_SCK);	//LCD_SCL_CLR;	
		HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK, GPIO_PIN_RESET);
    SPI_PANEL_Write_u8_Cmd_NoCS(SPI_Mode,0xF1);
    SPI_PANEL_Write_u8_Cmd_NoCS(SPI_Mode,reg);
    
    if(SPI_Mode == SPI4_Mode)
    {
        SPI_PANEL_4L_DCX_Select(channel,1);       //DCX = 0 ?? ??
    }
    /////RM69310????clk???page??????
    //GPIO_ResetBits( SPI1_SCK_Periph_GPIO,  SPI1_SCK);	//LCD_SCL_CLR;
		HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK, GPIO_PIN_RESET);
	//GPIO_SetBits( SPI1_SCK_Periph_GPIO,  SPI1_SCK);	//LCD_SCL_SET;
		HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK, GPIO_PIN_SET);
    for(j=0;j<back_num;j++)
	{
		para[j] = SPI3_PANEL_Read_u8_Data_NoCS();
	}
	SPI_PANEL_CS_Select(channel,1);	
	return value;    
}

//用于通用4线SPI，读写一根线 （限Page 00）
u8 GenR_SPI4_Read_u8_Data_3line_Page0(u8 SPI_Mode,u8 channel,u8 reg,u8 *para,u8 back_num)
{
		u8 value = 0;
		SPI_PANEL_CS_Select(channel,0);
		HAL_GPIO_WritePin( SPI1_SCK_Periph_GPIO,  SPI1_SCK,GPIO_PIN_RESET);	//LCD_SCL_CLR;
		//SPI_PANEL_Write_u8_Cmd_NoCS(SPI_Mode,0xF1);
		SPI_PANEL_Write_u8_Cmd_NoCS(SPI_Mode,reg);

		if(SPI_Mode == SPI4_Mode)
		{
			 SPI_PANEL_4L_DCX_Select(channel,1);       //DCX = 0 表示 命令
		}
		 MOSI_PANEL_IO_INPUT(); 
		for(u8 j=0;j<back_num;j++)
		{
			para[j]= SPI3_PANEL_Read_u8_Data_NoCS_SDA();
		}
		SPI_CS_Select(channel,1);	
		MOSI_PANEL_IO_OUTPUT();
		return value; 
}

//用于通用4线SPI，读写一根线
u8 GenR_SPI4_Read_u8_Data_3line(u8 SPI_Mode,u8 channel,u8 reg,u8 *para,u8 back_num)
{
	u8 value = 0;
	SPI_PANEL_CS_Select(channel,0);
    HAL_GPIO_WritePin( SPI1_SCK_Periph_GPIO,  SPI1_SCK,GPIO_PIN_RESET);	//LCD_SCL_CLR;
    SPI_PANEL_Write_u8_Cmd_NoCS(SPI_Mode,0xF1);
    SPI_PANEL_Write_u8_Cmd_NoCS(SPI_Mode,reg);
    
    if(SPI_Mode == SPI4_Mode)
    {
       SPI_PANEL_4L_DCX_Select(channel,1);       //DCX = 0 表示 命令
    }
    /////RM69310新增一个clk。特殊page回读时使用。
	MOSI_PANEL_IO_INPUT(); 
	HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK, GPIO_PIN_RESET);	//LCD_SCL_CLR;
	delay_6ns(1);
	HAL_GPIO_WritePin	( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK, GPIO_PIN_SET);	//LCD_SCL_SET;
	for(u8 j=0;j<back_num;j++)
	{
		para[j]= SPI3_PANEL_Read_u8_Data_NoCS_SDA();
	}
	SPI_CS_Select(channel,1);	
	MOSI_PANEL_IO_OUTPUT();
	return value; 
}

void GenW_PANEL_SPI_Write_code(u8 SPI_Mode,u8 channel ,u8 para[])
{  
	int i;
	HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK, GPIO_PIN_RESET);	//LCD_SCL_CLR;
	SPI_PANEL_CS_Select(channel,0);
    SPI_PANEL_Write_u8_Cmd_NoCS(SPI_Mode,para[3]); //cmd
	for(i=1;i<para[2];i++) //para2->length
	{
		SPI_PANEL_Write_u8_Data_NoCS(SPI_Mode,para[3+i]);
	}
	HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK, GPIO_PIN_RESET);	//LCD_SCL_CLR;
	SPI_PANEL_CS_Select(channel,1);
}
void GenW_PANEL_SPI_Write_code_cuihuashan(u8 SPI_Mode,u8 channel ,u8 para[])
{  
//	int i;
	HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK, GPIO_PIN_RESET);	//LCD_SCL_CLR;
    SPI_PANEL_Write_u8_Cmd(SPI_Mode,channel,0xFE); //cmd   page
	SPI_PANEL_Write_u8_Data(SPI_Mode,channel,para[3]);//cmd   page
//	for(i=0;i<para[2];i++) //para2->length
	{
		SPI_PANEL_Write_u8_Cmd(SPI_Mode,channel,para[4]);
		SPI_PANEL_Write_u8_Data(SPI_Mode,channel,para[5]);
	}
//	SPI_PANEL_CS_Select(channel,1);
}
void GenW_PANEL_normal_SPI_Write_code(u8 SPI_Mode,u8 channel ,u8 para[])
{  
	int i;
	HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK, GPIO_PIN_RESET);	//LCD_SCL_CLR;
    SPI_PANEL_Write_u8_Cmd(SPI_Mode,channel,para[1]); //cmd
	for(i=1;i<para[0];i++) //para2->length
	{
		SPI_PANEL_Write_u8_Data(SPI_Mode,channel,para[1+i]);
	}
}

void SPI_PANEL_Write_u8_Array(u8 SPI_Mode,u8 channel ,u8* para)
{
	u8 i,j;
	i = 1;
	HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK, GPIO_PIN_RESET);	//LCD_SCL_CLR;

	SPI_PANEL_CS_Select(channel,0);
	SPI_PANEL_Write_u8_Cmd_NoCS(SPI_Mode,para[1]);
	for(j=0;j<para[0]-1;j++)
	{
		SPI_PANEL_Write_u8_Data_NoCS(SPI_Mode,para[1+i+j]);
	}
	HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK, GPIO_PIN_RESET);	//LCD_SCL_CLR;
	SPI_PANEL_CS_Select(channel,1);
	delay_ms(5);
}
void SPI_PANEL_Write_u8_Array_37350(u8 SPI_Mode,u8 channel ,u8* para,u8 len)
{
	u8 j;

	HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK, GPIO_PIN_RESET);	//LCD_SCL_CLR;

	SPI_PANEL_CS_Select(channel,0);
	SPI_PANEL_Write_u8_Cmd_NoCS(SPI_Mode,para[0]);
	for(j=1;j<len;j++)
	{
		SPI_PANEL_Write_u8_Data_NoCS(SPI_Mode,para[j]);
	}
	SPI_PANEL_CS_Select(channel,1);
	delay_ms(5);
}
void SPI_PANEL_Write_u8_Array_code(u8 SPI_Mode,u8 channel ,u8* para)
{
	u8 j;
	//u8 i = 1;
	HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK, GPIO_PIN_RESET);	//LCD_SCL_CLR;

	SPI_PANEL_CS_Select(channel,0);
	SPI_PANEL_Write_u8_Cmd_NoCS(SPI_Mode,para[3]);
	SPI_PANEL_CS_Select(channel,1);
	SPI_PANEL_CS_Select(channel,0);
	for(j=0;j<para[2]-1;j++)
	{
		SPI_PANEL_Write_u8_Data_NoCS(SPI_Mode,para[4+j]);
	}
	SPI_PANEL_CS_Select(channel,1);
	delay_ms(1);  
}

/*****************************************************
    ??8bit
   ?8bit??
*******************************************************/

u8 SPI4_PANEL_Read_u8_Data(u8 SPI_Mode,u8 channel ,u8 cmd)
{
	u8 j,value = 0;
	SPI_PANEL_CS_Select(channel,0);
    HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK, GPIO_PIN_RESET);	//LCD_SCL_CLR;
    SPI_PANEL_Write_u8_Cmd_NoCS(SPI_Mode,cmd);
    
    if(SPI_Mode == SPI4_Mode)
    {
        SPI_PANEL_4L_DCX_Select(channel,1);       //DCX = 1数据 ?? ??
    }
    value = SPI3_Read_u8_Data_NoCS();
	SPI_PANEL_CS_Select(channel,1);	
	return value;
	
}
u8 SPI4_PANEL_Read_u8_Data_cuihuashan_page(u8 SPI_Mode,u8 channel ,u8 page, u8 cmd)
{
	u8 value = 0;
	SPI_PANEL_CS_Select(channel,0);
    HAL_GPIO_WritePin( SPI1_SCK_Periph_GPIO,  SPI1_SCK,GPIO_PIN_RESET);	//LCD_SCL_CLR;
    SPI_PANEL_Write_u8_Cmd_NoCS(SPI_Mode,0xFE);
    SPI_PANEL_Write_u8_Data_NoCS(SPI_Mode,page);
    SPI_PANEL_Write_u8_Cmd_NoCS(SPI_Mode,0xF1);
    SPI_PANEL_Write_u8_Cmd_NoCS(SPI_Mode,cmd);
    
    if(SPI_Mode == SPI4_Mode)
    {
        SPI_PANEL_4L_DCX_Select(channel,1);       //DCX = 0 表示 命令
    }
    /////RM69310新增一个clk。特殊page回读时使用。
	MOSI_PANEL_IO_INPUT(); 
	HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK, GPIO_PIN_RESET);	//LCD_SCL_CLR;
	HAL_GPIO_WritePin	( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK, GPIO_PIN_SET);	//LCD_SCL_SET;

	value = SPI3_PANEL_Read_u8_Data_NoCS_SDA();
	SPI_PANEL_CS_Select(channel,1);	
	MOSI_PANEL_IO_OUTPUT();
	return value;     
}
u8 SPI4_PANEL_Read_u8_Data_cuihuashan_page_Alan(u8 SPI_Mode,u8 channel ,u8 page, u8 cmd,u8 para[],u8 back_num)
{
	u8 value = 0;
	u8 i=0;
	
	SPI_PANEL_CS_Select(channel,0);
    HAL_GPIO_WritePin( SPI1_SCK_Periph_GPIO,  SPI1_SCK,GPIO_PIN_RESET);	//LCD_SCL_CLR;

    SPI_PANEL_Write_u8_Cmd_NoCS(SPI_Mode,cmd);
    
    if(SPI_Mode == SPI4_Mode)
    {
        SPI_PANEL_4L_DCX_Select(channel,1);       //DCX = 0 表示 命令
    }
    /////RM69310新增一个clk。特殊page回读时使用。
	 MOSI_PANEL_IO_INPUT(); 
	if(back_num>1)
	{
		HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK, GPIO_PIN_RESET);	//LCD_SCL_CLR;
		HAL_GPIO_WritePin	( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK, GPIO_PIN_SET);	//LCD_SCL_SET;
	}
	for(i=0;i<back_num;i++)
	{
		para[3+i] = SPI3_PANEL_Read_u8_Data_NoCS_SDA();
	}
	SPI_PANEL_CS_Select(channel,1);	
	MOSI_PANEL_IO_OUTPUT();
	return value;     
}
u8 SPI4_PANEL_Read_u8_Data_page(u8 SPI_Mode,u8 channel ,u8 page ,u8 cmd)
{
	u8 value = 0;   //u8 j;
	SPI_PANEL_CS_Select(channel,0);
    HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK, GPIO_PIN_RESET);	//LCD_SCL_CLR;
    SPI_PANEL_Write_u8_Cmd_NoCS(SPI_Mode,0xFE);
    SPI_PANEL_Write_u8_Data_NoCS(SPI_Mode,page);
    SPI_PANEL_Write_u8_Cmd_NoCS(SPI_Mode,0xF1);
    SPI_PANEL_Write_u8_Cmd_NoCS(SPI_Mode,cmd);
    
    if(SPI_Mode == SPI4_Mode)
    {
        SPI_PANEL_4L_DCX_Select(channel,1);       //DCX = 0 ?? ??
    }
    /////RM69310????clk???page??????
    HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK, GPIO_PIN_RESET);	//LCD_SCL_CLR;
	HAL_GPIO_WritePin	( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK, GPIO_PIN_SET);	//LCD_SCL_SET;
    
    value = SPI3_PANEL_Read_u8_Data_NoCS();
	SPI_PANEL_CS_Select(channel,1);	
	return value; 
	    
}

u8 SPI4_PANEL_Read_u8_Data_array(u8 SPI_Mode,u8 channel ,u8* para)
{
	u8 j = 0;

	SPI_PANEL_CS_Select(channel,0);
    HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK, GPIO_PIN_RESET);	//LCD_SCL_CLR;
    SPI_PANEL_Write_u8_Cmd_NoCS(SPI_Mode,para[3]);
    
    if(SPI_Mode == SPI4_Mode)
    {
        SPI_PANEL_4L_DCX_Select(channel,1);       //DCX = 0 ?? ??
    }
    /////FT2201??8?clk?
    MOSI_PANEL_IO_INPUT(); 
    delay_us(1);
    HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK, GPIO_PIN_RESET);	//LCD_SCL_CLR;
    for(j=0;j<8;j++)
    {
        HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK, GPIO_PIN_RESET);	//LCD_SCL_CLR;
        delay_6ns(1);
        HAL_GPIO_WritePin	( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK, GPIO_PIN_SET);	//LCD_SCL_SET;
        delay_6ns(1);
    }
    delay_us(1);
    for(j=0;j<para[2]-1;j++)
    {
        HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK, GPIO_PIN_RESET);	//LCD_SCL_CLR;
        para[j+3] = SPI3_Read_u8_Data_NoCS();
        delay_us(1);
    }
	SPI_PANEL_CS_Select(channel,1);	
    MOSI_PANEL_IO_OUTPUT(); 
    delay_us(1);
	return 0; 

}
u8 SPI4_PANEL_Read_u8_Data_array_37350(u8 SPI_Mode,u8 channel ,u8* para,u8 len)
{
	u8 j = 0;

	SPI_PANEL_CS_Select(channel,0);
    HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK, GPIO_PIN_RESET);	//LCD_SCL_CLR;
	SPI_PANEL_Write_u8_Cmd_NoCS(SPI_Mode,0XFC);
	SPI_PANEL_Write_u8_Data_NoCS(SPI_Mode,para[0]);
    SPI_PANEL_Write_u8_Cmd_NoCS(SPI_Mode,0XFD);

    MOSI_PANEL_IO_INPUT(); 
		if(SPI_Mode == SPI4_Mode)
    {
        SPI_PANEL_4L_DCX_Select(channel,1);       //DCX = 0 ?? ??
    }
		
	HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK,GPIO_PIN_RESET);	//LCD_SCL_CLR;
	delay_6ns(5);
	HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK,GPIO_PIN_SET);	//LCD_SCL_SET;	
		
    for(j=1;j<len;j++)
    {
        HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK, GPIO_PIN_RESET);	//LCD_SCL_CLR;
        para[j] = SPI3_PANEL_Read_u8_Data_NoCS_SDA();
        delay_us(1);
    }
	SPI_PANEL_CS_Select(channel,1);	
    MOSI_PANEL_IO_OUTPUT(); 
    delay_us(1);
	return 0; 
}
u8 SPI4_PANEL_Read_u8_Data_array_GenWR(u8 SPI_Mode,u8 channel ,u8 reg,u8* para,u8 len)
{
	u8 j = 0;

	SPI_PANEL_CS_Select(channel,0);
    HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK, GPIO_PIN_RESET);	//LCD_SCL_CLR;
	SPI_PANEL_Write_u8_Cmd_NoCS(SPI_Mode,0XFC);
	SPI_PANEL_Write_u8_Data_NoCS(SPI_Mode,reg);
    SPI_PANEL_Write_u8_Cmd_NoCS(SPI_Mode,0XFD);

    MOSI_PANEL_IO_INPUT(); 
		if(SPI_Mode == SPI4_Mode)
    {
        SPI_PANEL_4L_DCX_Select(channel,1);       //DCX = 0 ?? ??
    }
		
	HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK,GPIO_PIN_RESET);	//LCD_SCL_CLR;
	delay_6ns(5);
	HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK,GPIO_PIN_SET);	//LCD_SCL_SET;	
		
    for(j=0;j<len;j++)
    {
        HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK, GPIO_PIN_RESET);	//LCD_SCL_CLR;
        para[j] = SPI3_PANEL_Read_u8_Data_NoCS_SDA();
        delay_us(1);
    }
	SPI_PANEL_CS_Select(channel,1);	
    MOSI_PANEL_IO_OUTPUT(); 
    delay_us(1);
	return 0; 
}
u8 SPI4_PANEL_Read_u8_Data_array_SDA(u8 SPI_Mode,u8 channel ,u8* para)
{
	u8 j = 0;

	SPI_PANEL_CS_Select(channel,0);
    HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK, GPIO_PIN_RESET);	//LCD_SCL_CLR;
	SPI_PANEL_Write_u8_Data_NoCS(SPI_Mode,para[3]);

    if(SPI_Mode == SPI4_Mode)
    {
        SPI_PANEL_4L_DCX_Select(channel,1);       //DCX = 0 ?? ??
    }
    /////FT2201??8?clk?
    MOSI_PANEL_IO_INPUT(); 
    delay_us(1);
     
    HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK, GPIO_PIN_RESET);	//LCD_SCL_CLR;
    for(j=0;j<8;j++)
    {
        HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK,GPIO_PIN_RESET);	//LCD_SCL_CLR;
        delay_6ns(1);
        HAL_GPIO_WritePin	( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK,GPIO_PIN_SET);	//LCD_SCL_SET;
        delay_6ns(1);
    }
    delay_us(1);
    for(j=0;j<para[2]-1;j++)
    {
        HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK, GPIO_PIN_RESET);	//LCD_SCL_CLR;
        para[j+3] = SPI3_PANEL_Read_u8_Data_NoCS_SDA();
        delay_us(1);
    }
	SPI_PANEL_CS_Select(channel,1);	
    MOSI_PANEL_IO_OUTPUT(); 
    delay_us(1);
	return 0; 
	  
}

u8 SPI4_PANEL_Read_u8_Data_array_SDA_Alan(u8 SPI_Mode,u8 channel ,u8* para)
{
	u8 j = 0;

	SPI_PANEL_CS_Select(channel,0);
    HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK, GPIO_PIN_RESET);	//LCD_SCL_CLR;
    SPI_PANEL_Write_u8_Cmd_NoCS(SPI_Mode,0xFE);
    SPI_PANEL_Write_u8_Data_NoCS(SPI_Mode,para[3]);
    SPI_PANEL_Write_u8_Cmd_NoCS(SPI_Mode,0xF1);
	SPI_PANEL_Write_u8_Data_NoCS(SPI_Mode,para[4]);

    if(SPI_Mode == SPI4_Mode)
    {
        SPI_PANEL_4L_DCX_Select(channel,1);       //DCX = 0 ?? ??
    }
    /////FT2201??8?clk?
    MOSI_PANEL_IO_INPUT(); 
    delay_us(1);
     
    if((para[5])>1)
	{
		HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK,GPIO_PIN_RESET);	//LCD_SCL_CLR;
		delay_6ns(1);
		HAL_GPIO_WritePin	( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK,GPIO_PIN_SET);	//LCD_SCL_SET;
		delay_6ns(1);
	}
    for(j=0;j<para[5];j++)
	{
		HAL_GPIO_WritePin( SPI_PANEL_SCK_Periph_GPIO,  SPI_PANEL_SCK,GPIO_PIN_RESET);	//LCD_SCL_CLR;
		para[j+3] = SPI3_PANEL_Read_u8_Data_NoCS_SDA();
	}
	SPI_PANEL_CS_Select(channel,1);	
    MOSI_PANEL_IO_OUTPUT(); 
    delay_us(1);
	return 0; 
	  
}

//void SPI_Set_Window(u8 SPI_Mode,u8 channel ,u16 x0,u16 x1,u16 y0,u16 y1)
//{
//	SPI_Write_code(SPI_Mode,channel ,0xFE,0x00);
//	SPI_PANEL_Write_u8_Cmd(SPI_Mode,channel ,0x2A);
//	SPI_PANEL_Write_u8_Data(SPI_Mode,channel ,(x0>>8));
//	SPI_PANEL_Write_u8_Data(SPI_Mode,channel ,x0&0xFF);
//	SPI_PANEL_Write_u8_Data(SPI_Mode,channel ,(x1>>8));
//	SPI_PANEL_Write_u8_Data(SPI_Mode,channel ,x1&0xFF);

//	SPI_PANEL_Write_u8_Cmd(SPI_Mode,channel ,0x2B);
//	SPI_PANEL_Write_u8_Data(SPI_Mode,channel ,(y0>>8));
//	SPI_PANEL_Write_u8_Data(SPI_Mode,channel ,y0&0xFF);
//	SPI_PANEL_Write_u8_Data(SPI_Mode,channel ,(y1>>8));
//	SPI_PANEL_Write_u8_Data(SPI_Mode,channel ,y1&0xFF); 
//}
void SPI_PANEL_WriteRAM_buffer_part(u8 SPI_Mode,u8 channel ,u8* buffer ,u16 length,u8  multiple ,u8 Flag,u8 DUAL_SPI_MODE,u8 RGB_fromat)
{
  	uint32_t i,k=0;
	for(i=0;i<length*multiple;i++)
	{
        SPI_PANEL_CS_Select(channel,0);  
        if((Flag == 1)&&(k == 0))
        {
            k = 1;
            SPI_PANEL_Write_u8_Cmd_NoCS(SPI_Mode,0x2c); 
        }
        else
        {
            SPI_PANEL_Write_u8_Cmd_NoCS(SPI_Mode,0x3c); 
        }
		switch(DUAL_SPI_MODE)
		{
			case 0://spi3 1P1T 1wrie
			{

			}break;
			case 1://spi3 1P1T 2wrie
			{
			}break;
			case 2://spi3 2P3T 1wrie
			{
			}break;
			case 3://spi4 1P1T 1wrie
			{
				if(RGB_fromat == 2)
				{
				//	SPI_PANEL_Write_1P1T1_Data_NoCS((buffer[i*2 +1]<<8)+buffer[i*2],RGB_fromat);
					SPI_PANEL_Write_1P1T1_Data_NoCS((((buffer[i*3 +2]&0xf8)+((buffer[i*3 +1]&0xfc)>>5))<<8)+((buffer[i*3 +1]&0xfc<<3)+((buffer[i*3]&0xf8)>>3)),RGB_fromat);

					SPI_PANEL_CS_Select(channel,1);
				}
				else if(RGB_fromat == 1)
				{
					SPI_PANEL_Write_1P1T1_Data_NoCS(((buffer[i*3 +2])<<16)+(buffer[i*3 +1]<<8)+buffer[i*3],RGB_fromat);
					SPI_PANEL_CS_Select(channel,1);
				}

			//	SPI_PANEL_CS_Select(channel,0);
			//	SPI_PANEL_Write_1P1T1_Data_NoCS(((buffer[i*3 +2])<<16)+(buffer[i*3 +1]<<8)+buffer[i*3],RGB_fromat);
			}break;	
			case 4://spi4 1P1T 2wrie
			{
				SPI_PANEL_Write_1P1T2_Data_NoCS(((buffer[i*3 +2])<<16)+(buffer[i*3 +1]<<8)+buffer[i*3],RGB_fromat);
				SPI_PANEL_CS_Select(channel,1);
			//	SPI_PANEL_CS_Select(channel,0);
			//	SPI_PANEL_Write_1P1T1_Data_NoCS(((buffer[i*3 +2])<<16)+(buffer[i*3 +1]<<8)+buffer[i*3],1);
			}break;
			case 5://spi4 2P3T 2wrie
			{
				SPI_PANEL_Write_2P3T_Data_NoCS((u16)((buffer[i*3 +2])<<8)+buffer[i*3 +1],RGB_fromat);   

				SPI_PANEL_CS_Select(channel,1);
				SPI_PANEL_CS_Select(channel,0);
				
				SPI_PANEL_Write_2P3T_Data_NoCS((u16)((buffer[i*3])<<8)+buffer[(i+1)*3 +2],RGB_fromat);
				
				SPI_PANEL_CS_Select(channel,1);
				SPI_PANEL_CS_Select(channel,0);
				
				SPI_PANEL_Write_2P3T_Data_NoCS((u16)((buffer[(i+1)*3 +1])<<8)+buffer[(i+1)*3],RGB_fromat);
				
				SPI_PANEL_CS_Select(channel,1);
				i++;
			}break;
		}
		SPI_PANEL_CS_Select(channel,1);       
	}        
}


void SPI3_PANEL_WriteRAM(u8 SPI_Mode,u8 channel ,u16 H_OLED,u16 V_OLED,u8 R,u8 G, u8 B, u8 flag,u8 RGB_fromat)
{
  	uint32_t i,k=0;
	if(RGB_fromat == 2)
	{
		if(R<32&&G<64&&B<32)
		{
			TO_RGB565[0] = (G<<5) + B;
			TO_RGB565[1] = (R<<3)+(G>>3);
		}
		else
		{
			if(R==0xff&&G==0x00&&B==0x00)
			{
				TO_RGB565[0] = 0x00;
				TO_RGB565[1] = 0xF8;
			}
			else if(R==0x00&&G==0xff&&B==0x00)
			{
				TO_RGB565[0] = 0xE0;
				TO_RGB565[1] = 0x07;
			}
			else if(R==0x00&&G==0x00&&B==0xff)
			{
				TO_RGB565[0] = 0x1F;
				TO_RGB565[1] = 0x00;
			}
			else if(R==0x00&&G==0x00&&B==0x00)
			{
				TO_RGB565[0] = 0x00;
				TO_RGB565[1] = 0x00;
			}
			else
			{
				TO_RGB565[0] = 0xff;
				TO_RGB565[1] = 0xFF;
			}
		}
	}
	for(i=0;i<H_OLED*V_OLED;i++)
	{
        SPI_PANEL_CS_Select(channel,0);                     
        if(k==0)
        {    
            k=1;
            SPI_PANEL_Write_u8_Cmd_NoCS(SPI_Mode,0x2c); 
        }  
        else
            SPI_PANEL_Write_u8_Cmd_NoCS(SPI_Mode,0x3c);  
		switch(flag)
		{
			case 0://spi3 1P1T 1wrie
			{

			}break;
			case 1://spi3 1P1T 2wrie
			{
			}break;
			case 2://spi3 2P3T 1wrie
			{
			}break;
			case 3://spi4 1P1T 1wrie
			{
				if(RGB_fromat == 2)
				{
				//	SPI_PANEL_Write_1P1T1_Data_NoCS((TO_RGB565[1]<<8)+TO_RGB565[0],RGB_fromat);
					SPI_PANEL_Write_1P1T1_Data_NoCS((((R&0xf8)+((G&0xfc)>>5))<<8)+((G&0xfc<<3)+((B&0xf8)>>3)),RGB_fromat);
				}
				else
					SPI_PANEL_Write_1P1T1_Data_NoCS((R<<16)+(G<<8)+B,RGB_fromat);
			//	SPI_PANEL_CS_Select(channel,1);
			//	SPI_PANEL_CS_Select(channel,0);
			//	SPI_PANEL_Write_1P1T1_Data_NoCS((R<<16)+(G<<8)+B,1);
			}break;	
			case 4://spi4 1P1T 2wrie
			{
				SPI_PANEL_Write_1P1T2_Data_NoCS((R<<16)+(G<<8)+B,RGB_fromat);
				//SPI_PANEL_Write_1P1T1_Data_NoCS((R<<16)+(G<<8)+B,RGB_fromat);
		//		SPI_PANEL_CS_Select(channel,1);
		//		SPI_PANEL_CS_Select(channel,0);
		//		SPI_PANEL_Write_1P1T1_Data_NoCS((R<<16)+(G<<8)+B,1);
			}break;
			case 5://spi4 2P3T 2wrie
			{
				SPI_PANEL_Write_2P3T_Data_NoCS((u16)(R<<8)+G,RGB_fromat);   

				SPI_PANEL_CS_Select(channel,1);
				SPI_PANEL_CS_Select(channel,0);

				SPI_PANEL_Write_2P3T_Data_NoCS((u16)(B<<8)+R,RGB_fromat);

				SPI_PANEL_CS_Select(channel,1);
				SPI_PANEL_CS_Select(channel,0);

				SPI_PANEL_Write_2P3T_Data_NoCS((u16)(G<<8)+B,RGB_fromat);
				
				SPI_PANEL_CS_Select(channel,1); 
				i++;
			}break;
		}
        SPI_PANEL_CS_Select(channel,1); 
 //       i++;   
	}        
}
